package com.hwd.gmall.list.listener;

import com.hwd.gmall.common.constant.ProductConst;
import com.hwd.gmall.list.service.GoodsService;
import com.rabbitmq.client.Channel;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 监听sku商品上下架同步消息的消费者
 *
 * @author 黄伟东/Victor
 * @date 2022/5/9 16:02
 */
@Component
@Log4j2
public class SkuListener {

    @Resource
    private GoodsService goodsService;

    /**
     * 监听shu商品上架数据同步的消息
     *
     * @param message 消息对象
     * @param channel 连接对象
     */
    @RabbitListener(queues = ProductConst.SKU_UPPER_QUEUE)
    public void skuUpperListener(Message message, Channel channel) {
        // 获取消息的编号
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        // 获取消息的内容，skuId
        long skuId = Long.parseLong(new String(message.getBody()));
        try {
            // 执行上架操作
            goodsService.removeGoodsFromEs(skuId);
            // 手动确认消息
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            try {
                // 判断是否第一次消费
                if (message.getMessageProperties().getRedelivered()) {
                    // 第二次消费失败，丢弃消息，不放回队列
                    log.error("连续两次消费商品上架数据同步的消息失败，同步失败的商品编号是: " + skuId);
                    log.error("同步失败的原因是: " + e.getMessage());
                    channel.basicReject(deliveryTag, false);
                }

                // 第一次消费消息失败，重试
                channel.basicAck(deliveryTag, true);
            } catch (Exception ex) {
                log.error("拒绝消息失败，失败的原因是: " + ex.getMessage());
                log.error("失败的商品编号是: " + skuId);
            }
        }
    }

    /**
     * 监听shu商品下架数据同步的消息
     *
     * @param message 消息对象
     * @param channel 连接对象
     */
    @RabbitListener(queues = ProductConst.SKU_DOWN_QUEUE)
    public void skuDownListener(Message message, Channel channel) {
        // 获取消息的编号
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        // 获取消息的内容，skuId
        long skuId = Long.parseLong(new String(message.getBody()));
        try {
            // 执行下架操作
            goodsService.saveSkuIntoEs(skuId);
            // 手动确认消息
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            try {
                // 判断是否第一次消费
                if (message.getMessageProperties().getRedelivered()) {
                    // 第二次消费失败，丢弃消息，不放回队列
                    log.error("连续两次消费商品下架数据同步的消息失败，同步失败的商品编号是: " + skuId);
                    log.error("同步失败的原因是: " + e.getMessage());
                    channel.basicReject(deliveryTag, false);
                }

                // 第一次消费消息失败，重试
                channel.basicAck(deliveryTag, true);
            } catch (Exception ex) {
                log.error("拒绝消息失败，失败的原因是: " + ex.getMessage());
                log.error("失败的商品编号是: " + skuId);
            }
        }
    }
}
